//Höhe, Breite und Tiefe der Karte
var mapH, mapW, mapD, map;
//var mapH = map.length, mapW = map[0].length, mapD = map[0][0].length;

//Konstanten
var WIDTH = window.innerWidth,
	HEIGHT = window.innerHeight,
	ASPECT = WIDTH / HEIGHT, //Seitenverhältnis
	UNITSIZE = 250, //Tiefe, Breite und Höhe eines Kartenabschnitts
	MOVESPEED = 200, //Bewegungsgeschwindigkeit
	LOOKSPEED = 0.3; //Geschwindigkeit für Umschauen
	BULLETMOVESPEED = MOVESPEED * 5;//geschwindigkeit für die  

//globale Variablen
date = new Date();
var t = THREE, //Zugriff auf three.js-Bibliothek
    scene, //Welt
    cam, //Kamera
    renderer, //Renderer
    controls, //Steuerung
    clock; //Zeitmessung
var runAnim = true, //Beginn des Spiels (true) (false bei Spielende)
    mouse = { x: 0, y: 0 }; //Startkoordinaten
    health = 100; //Leben
	maps = [];
	aktuelleMap = 1;

//Startknopf
$(document).ready(function() {
	$('#startbutton').bind('click', function(e) { //Spiel startet bei Klick auf Startbutton
		e.preventDefault(); //Standardevent wird nicht ausgeführt
		$('#start').fadeOut(); //Startbildschirm verschwindet
		init(); //Aufbau der Welt
		animate(); //Start der Animation
	});
});


function getNextMap(){
	//map = aamap;
	
	//map = second;
	
	map = first;
	
	//map = testU1;
	
	//console.log(map);
	//Höhe, Breite und Tiefe der Karte
	//map = maps[aktuelleMap];
	mapH = map.length;
	mapW = map[0].length;
	mapD = map[0][0].length;
	scene = new t.Scene();
	scene.fog = new t.FogExp2(0x64696d, 0.0015);	//0x818181, 0.0015);
	scene.add(cam);
	initScene();
	//erstellen einer Bullet um das PointLight für zukünftigen Bullets zu ermöglichen
	createBullet();
	console.log("es wird einmal eine karte erstellt");
	verloren = 0;
}

//Initialisierung
function init() {
	mapsInit();
	clock = new t.Clock(); //Zeitmesser
	projector = new t.Projector(); //Berechnung der Projektilrichtung
	
	//Kamera
	cam = new t.PerspectiveCamera(60, ASPECT, 1, 3000); //Seitenverhältnis, Elemente < 1 und > 3000 werden nicht angezeigt
	//cam.position.y = UNITSIZE * 0.2; //Starthöhe des Spielers
	getNextMap();
	//licht test
	cam.add(new t.PointLight(0x0000ff, 10 ,500));
	//Steuerung
	controls = new Controls(cam);
	controls.movementSpeed = MOVESPEED;
	controls.lookSpeed = LOOKSPEED;

	//WebGL als Renderer verwenden
	renderer = new t.WebGLRenderer();
	renderer.setSize(WIDTH, HEIGHT); //Breite und Höhe des Bildausschnitts
	
	//bindet Canvas-Tag in DOM-Baum ein
	renderer.domElement.style.backgroundColor = '#EED6F1'; //Hintergrundfarbe der Welt
	document.body.appendChild(renderer.domElement);
	
	 //bindet Interface ein
	$('#interface').load('./interface.html', function(){
		document.getElementById("gegnerAnzahl").innerHTML = geg.length;
	});
	$('#interface').show();
 }

//regelmäßige Animationsfunktion
function animate() {
	if (runAnim) {
		requestAnimationFrame(animate); //animate wird immer wieder aufgerufen
	}
	render(); //Änderungen werden ausgeführt, Welt wird aufgerufen
}

//führt Aktualisierungen in der Welt durch und lässt sie rendern 
function render() {
	
	//aktualisiert Perspektive anhand Steuerung
	var delta = clock.getDelta();
	controls.update(delta); 
	//berechnet die "Geschwindikeit" der Kugeln 
	var speed = delta * BULLETMOVESPEED;

	// updated die possition des Projektils
	updateProjektil(speed);
	
	updateMines(speed);
	if(bosse != 0){
		rotBoss();
		bossAttack();
	}
	checkItems();
	
	//checkGegnerCooldown();
	gegnerAttack();
	gegnerMove(speed);
	
	//Bildschirmausgabe
	renderer.render(scene, cam);
		
	if (runAnim) {

			// gewonnen
		if (gewonnen == 1) {
			runAnim = false;
				$(renderer.domElement).fadeOut();
			$('#interface').fadeOut();
			$('#end').load('./winner.html', function() {
				$('#againbutton').bind('click', function(e) {
					location.reload();
				});
			});
			$('#end').show();
		}
				// verloren
		if (health <= 0) {
			verloren = 1;
			runAnim = false;
			$(renderer.domElement).fadeOut();
			$('#interface').fadeOut();
			$('#end').load('./loser.html', function() {
				$('#againbutton').bind('click', function(e) {
					location.reload(false);
					
					});
		});
			$('#end').show();
		}
	}
}
//Walls

function wall(x, y, z, mat){
	this.xPo = x;
	this.yPo = y;
	this.zPo = z;
	this.material = mat;
	this.wallGeo = new t.BoxGeometry(UNITSIZE, UNITSIZE, UNITSIZE);


	this.mesh = new t.Mesh(this.wallGeo, this.material);
	
	this.mesh.position.set(x, y, z);
	
	this.mesh.geometry.computeBoundingBox();
	this.mesh.geometry.boundingBox = new t.Box3().setFromObject(this.mesh)
	
	
	scene.add(this.mesh);
}



//fügt Mauern und Licht in Szene ein
function initScene() {

	//Wandform
	var cube = new t.BoxGeometry(UNITSIZE, UNITSIZE, UNITSIZE);
	//Wandtexturen
	var materials = [
	                 new t.MeshLambertMaterial({map: t.ImageUtils.loadTexture('images/boden_1.jpg')}),
	                 new t.MeshLambertMaterial({map: t.ImageUtils.loadTexture('images/boden_2.jpg')}),
	                 new t.MeshLambertMaterial({map: t.ImageUtils.loadTexture('images/boden_3.jpg')}),
	                 new t.MeshLambertMaterial({map: t.ImageUtils.loadTexture('images/boden_4.jpg')}),
	                 new t.MeshLambertMaterial({map: t.ImageUtils.loadTexture('images/wand_1.jpg')}),
	                 new t.MeshLambertMaterial({map: t.ImageUtils.loadTexture('images/wand_2.jpg')}),
	                 new t.MeshLambertMaterial({map: t.ImageUtils.loadTexture('images/wand_3.jpg')}),
	                 new t.MeshLambertMaterial({map: t.ImageUtils.loadTexture('images/wand_4.jpg')}),
	                 ];
	//Wandstücke an den entsprechenden Stellen platzieren (Mauern um Spieler herum platzieren)
	for (var i = 0; i < mapH; i++) { //i = Höhe des jeweiligen Elements
	
	
	
		for (var j = 0; j < map[i].length; j++) { //j = Breite des jeweiligen Elements
			for (var k = 0, m = map[i][j].length; k < m; k++) { //k = Tiefe des jeweiligen Elements
				if(map[i][j][k] == -10){
					cam.position.x = (j - mapW/2) * UNITSIZE;
					cam.position.y = (i - mapH/2) * UNITSIZE;
					cam.position.z = (k - mapD/2) * UNITSIZE;
				}
				else if(map[i][j][k] == -11){
					//console.log("hier wäre ein heal");
					xP = (j - mapW/2) * UNITSIZE;
					yP = (i - mapH/2) * UNITSIZE;
					zP = (k - mapD/2) * UNITSIZE;
					//console.log(xP, yP, zP);
					new heal(xP, yP, zP);
				}
				else if(map[i][j][k] == -9){
					//console.log("hier wäre ein exit");
					xP = (j - mapW/2) * UNITSIZE;
					yP = (i - mapH/2) * UNITSIZE;
					zP = (k - mapD/2) * UNITSIZE;
					//console.log(xP, yP, zP);
					new exit(xP, yP, zP);
				}
				else if(map[i][j][k] == -8){
					//console.log("hier wäre ein boss");
					xP = (j - mapW/2) * UNITSIZE;
					yP = (i - mapH/2) * UNITSIZE;
					zP = (k - mapD/2) * UNITSIZE;
					//console.log(xP, yP, zP);
					new boss(xP, yP, zP);
				}
				else if(map[i][j][k] == -2){
					//console.log("hier wäre eine mine");
					xP = (j - mapW/2) * UNITSIZE;
					yP = (i - mapH/2) * UNITSIZE;
					zP = (k - mapD/2) * UNITSIZE;
					//console.log(xP, yP, zP);
					new mines(xP, yP, zP);
				}
				else if(map[i][j][k] < 0){
					//console.log("hier wäre ein kandidat :D");
					xP = (j - mapW/2) * UNITSIZE;
					yP = (i - mapH/2) * UNITSIZE;
					zP = (k - mapD/2) * UNITSIZE;
					//console.log(xP, yP, zP);
					new gegner(xP, yP, zP);
				}
				else if(map[i][j][k]) { //wird nur ausgeführt, wenn != 0, da 0 = Leerraum
	                var wall = new t.Mesh(cube, materials[map[i][j][k]-1]); //Geometrie wird mit Textur versehen
                    wall.position.x = (j - mapW/2) * UNITSIZE; //(Breite - halbe Gesamtbreite) * Wandwürfel
                    wall.position.y = (i - mapH/2) * UNITSIZE; //(Höhe - halbe Gesamthöhe) * Wandwürfel
                    wall.position.z = (k - mapD/2) * UNITSIZE; //(Tiefe - halbe Gesamttiefe) * Wandwürfel
                    scene.add(wall);
				}
			}
		}
	}
	
	
	//Licht
	var directionalLight1 = new t.DirectionalLight( 0x4B4B4B, 1 ); //Farbe des Lichts
	directionalLight1.position.set( 0.5, 1, 0.5 ); //Position des Lichts (vom Startpunkt)
	scene.add( directionalLight1 );
	var directionalLight2 = new t.DirectionalLight( 0x4B4B4B, 1 ); //Farbe des Lichts
	directionalLight2.position.set( -0.5, -1, -0.5 ); //Position des Lichts (vom Startpunkt)
	scene.add( directionalLight2 );
}

//Hilfsfunktion zur Kartenfeldberechnung
function getMapSector(v) {
	var x = Math.floor((v.x + UNITSIZE / 2) / UNITSIZE + mapW/2);
	var y = Math.floor((v.y + UNITSIZE / 2) / UNITSIZE + mapH/2);
	var z = Math.floor((v.z + UNITSIZE / 2) / UNITSIZE + mapD/2);
	return {x: x, y: y, z: z};
}

//überprüft Kollision eines Vektors mit Wand
function checkWallCollision(v) {
	var c = getMapSector(v);
	return map[c.y][c.x][c.z] > 0;
}

//passt Fenstergrößen an
$(window).resize(function() {
	WIDTH = window.innerWidth;
	HEIGHT = window.innerHeight;
	ASPECT = WIDTH / HEIGHT;
	if (cam) {
		cam.aspect = ASPECT;
		cam.updateProjectionMatrix(); //Perspektive aktualisieren
	}
	if (renderer) {
		renderer.setSize(WIDTH, HEIGHT);
	}
	$('#start').css({width: WIDTH, height: HEIGHT});
});

//bagground Musik

bgMusik = new Audio('Sounds/Prowl_OC.mp3');
    bgMusik.loop = true;
bgMusik.addEventListener('ended', function() {
    this.currentTime = 0;
    this.play();
}, false);
bgMusik.play();